package com.atguigu.gmall.order.config;

import com.atguigu.gmall.common.constant.MqConst;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

//项目启动就创建交换机
@Configuration
public class MqConfig {

    //交换机
    @Bean
    public Exchange orderEventExchange (){
//        String name, 交换机的名字
//        boolean durable, 是否持久化
//        boolean autoDelete, 是否自动删除
//        Map<String, Object> arguments
        return new TopicExchange(MqConst.ORDER_EVENT_EXCHANGE,
                true, false, null);
    }

    //延迟队列 不能让任何人监听
    @Bean
    public Queue orderDelayQueue (){
//        String name, 队列名字
//        boolean durable, 是否持久化
//        boolean exclusive, 是否排他
//        boolean autoDelete,是否自动删除
//        Map<String, Object> arguments参数设置
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", MqConst.ORDER_EVENT_EXCHANGE);
        arguments.put("x-dead-letter-routing-key", MqConst.ORDER_TIMEOUT_RK);
        arguments.put("x-message-ttl", MqConst.ORDER_TTL);//队列过期时间 30 分钟MqConst.ORDER_TTL
        return new Queue(MqConst.ORDER_DELAY_QUEUE,
                true, false, false, arguments);
    }

    //延迟绑定
    @Bean
    public Binding delayBinding (){
//        String destination, 目的地
//        DestinationType destinationType, 目的地类型
//        String exchange, 交换机
//        String routingKey,路由键
//        Map<String, Object> arguments参数
        //交换机 和 类型的 目的地 使用 路由键 进行绑定
        // order-event-exchange 交换机 和队列类型的order-delay-queue 目的地，使用路由键 order.create进行绑定
        return new Binding(
                MqConst.ORDER_DELAY_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConst.ORDER_EVENT_EXCHANGE,
                MqConst.ORDER_CREATE_RK,
                null);
    }

    //死信队列，消费者监听
    @Bean
    public Queue orderDeadQueue (){
//        String name, 队列名字
//        boolean durable, 是否持久化
//        boolean exclusive, 是否排他
//        boolean autoDelete,是否自动删除
//        Map<String, Object> arguments参数设置
        return new Queue(MqConst.ORDER_DEAD_QUEUE, true, false, false,null);
    }

    //死信绑定
    @Bean
    public Binding deadBinding (){
//        String destination, 目的地
//        DestinationType destinationType, 目的地类型
//        String exchange, 交换机
//        String routingKey,路由键
//        Map<String, Object> arguments参数
        //交换机 和 类型的 目的地 使用 路由键 进行绑定
        // order-event-exchange 交换机 和队列类型的order-delay-queue 目的地，使用路由键 order.create进行绑定
        return new Binding(
                MqConst.ORDER_DEAD_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConst.ORDER_EVENT_EXCHANGE,
                MqConst.ORDER_TIMEOUT_RK,
                null);
    }

    //订单支付成功队列
    @Bean
    public  Queue payedQueue(){
        return new Queue(MqConst.ORDER_PAYED_QUEUE,true,false,false);
    }
    //队列绑定
    @Bean
    public Binding payedBinding(){
        return new Binding(
                MqConst.ORDER_PAYED_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConst.ORDER_EVENT_EXCHANGE,
                MqConst.ORDER_PAYED_RK,
                null
        );
    }
}
